const fs = require('fs');
const path = require('path');
const os = require('os');

function mkdir(dir) {
    return new Promise((resolve, reject) => {
        fs.mkdir(dir, err => {
            if (err) {
                resolve(false);
            } else {
                resolve(true);
            }
        })
    });
}

function getStat(path) {
    return new Promise((resolve, reject) => {
        fs.stat(path, (err, stats) => {
            if (err) {
                resolve(false);
            } else {
                resolve(stats);
            }
        })
    })
}

async function dirExists(dir) {
    let isExists = await getStat(dir);
    //如果该路径存在且不是文件，返回true
    if (isExists && isExists.isDirectory()) {
        return true;
    } else if (isExists) {     //如果该路径存在但是文件，返回false
        return false;
    }
    //如果该路径不存在
    let tempDir = path.parse(dir).dir;      //拿到上级路径
    //递归判断，如果上级目录也不存在，则会代码会在此处继续循环执行，直到目录存在
    let status = await dirExists(tempDir);
    let mkdirStatus;
    if (status) {
        mkdirStatus = await mkdir(dir);
    }
    return mkdirStatus;
}

// function getStackTrace() {
//     const obj = {};
//     Error.captureStackTrace(obj, getStackTrace);
//     return obj.stack;
// };

// function log() {
//     let stack = getStackTrace() || '';
//     let matchResult = stack.match(/\(.*?\)/g) || [];
//     let line = matchResult[1] || '';
//     for (let i in arguments) {
//     }
//     if (typeof arguments[i] == 'object') {
//         arguments[i] = JSON.stringify(arguments[i])
//     }
//     arguments[i] += '----' + line.replace('(', '').replace(')', '')
//     console.log.apply(console, arguments)
// };

/**
 * 判断一个路径是否是文件
 *
 * @param {string} filePath 文件的绝对路径
 * @return {boolean} 
 */
function isFile(...filePath) {
    const fullPath = path.join(...filePath);

    try {
        const stat = fs.statSync(fullPath);

        if (stat.isFile()) {
            return true;
        } else {
            return false;
        }
    } catch {
        return false;
    }
}

/**
     * 获取服务器ip地址
     * TODO 在Linux系统上好像无效，无法获取地址
     *
     * @param {string} type 'IPv4' || 'IPv6'
     * @return {string} addr 服务器的IP地址 
     */
function getIPAddress(type) {
    type = type || 'IPv4';
    const ifaces = os.networkInterfaces();
    let addr = [];
    // try {
    for (let dev in ifaces) {
        ifaces[dev].forEach((details) => {
            if (details.family === type) {
                addr.push(details.address);
                // throw new Error(); // 抛出错误以跳出循环
            }
        });
    };
    // } catch { }

    return addr;
}

/**
* 给传入的数字前加上零，传入的不是数字或无法转换为数字则返回0
* 
* @param {number} target 
* @param {number} total 
* @return {string} 
* 
*/
function addZero(target, total) {
    target = isNaN(Number(target)) ? 0 : Number(target);
    target = target + '';
    if (target.length < total) {
        for (let i = 0; i < total - target.length + 1; i++) {
            target = '0' + target;
        }
        return target;
    } else {
        return target;
    }
}

//随机生成最大值不超过max的整数
function randInt(max) {
    return Math.floor(Math.random() * 100000 % max);
    //random生成0~1之间的随机数
}

module.exports = {
    dirExists: dirExists,
    isFile: isFile,
    getIPAddress: getIPAddress,
    addZero: addZero,
    randInt: randInt
}
